package educar.gui.admin.panels;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.ComponentOrientation;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;

import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;

import educar.controllers.DeleteCargoController;
import educar.controllers.IController;
import educar.gui.IView;
import educar.gui.admin.AddCargo;
import educar.gui.admin.EditCargo;
import educar.gui.admin.SearchCargo;
import educar.idioma.Locale;
import educar.listeners.ButtonListener;
import educar.models.Cargo;
import educar.models.cargoNotFound;



@SuppressWarnings("serial")
public class CargosPanel implements IView {
	/*arreglo que da nombre a las columnas*/
	public String[] columnNames = {};
	/*matriz que contiene los datos de la tabla*/
	public Object[][] data = {};
	/*modelo de la tabla*/
	DefaultTableModel model = new DefaultTableModel(data,columnNames);
	/*tabla no editable*/
	public JTable table = new JTable(model) {public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
	/*contenedor principal del panel*/
	private JPanel contenedor;
	
	
	/**
	 * Constructor de la clase
	 * crea un nuevo panel y agrega los elementos
	 * a mostrar: la tabla y el menu de opciones
	 */
	public CargosPanel(){
		/*Creo el contenedor*/
		contenedor = new JPanel(new BorderLayout());
		/*configuro la tabla*/
		table.setUpdateSelectionOnSort(false);
		table.setBorder(UIManager.getBorder("TextField.border"));
		table.setFillsViewportHeight(true);
		/*creo un panel con scroll para insertar la tabla y permitir navegar*/
		JScrollPane scrollPane = new JScrollPane(table);
		/*agrego la tabla y el panel de botones al panel principal*/
		contenedor.add(scrollPane,BorderLayout.CENTER);
		contenedor.add(ABMPanel(),BorderLayout.PAGE_END);
		/*Actualizo la tabla con la base de datos*/
		Refresh();
	}
		
		
		
	/**
	 * Crea el panel que contiene los botones de ABM
	 * */
	private JPanel ABMPanel(){				
		/*Creo el Panel de los Botones y lo configuro*/
		JPanel buttonsPane = new JPanel();
		buttonsPane.setLayout(new FlowLayout());
		
		/*Creo otro panel Contenedor con Titulo*/
		JPanel panel = new JPanel();
		panel.setBorder(new TitledBorder(null, "ABM Panel", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.setLayout(new FlowLayout());
		/*configuro la orientacion de los componentes*/
		buttonsPane.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
		/*
		 * luego agrego el panel al panel principal uno dentro
		 * del otro para que queden centrado en la pantalla 
		 */		
		buttonsPane.add(panel);		
		
		/*Boton agregar usuario*/
		JButton bAdd = new JButton(Locale.ADD+" "+Locale.CHARGE);
		panel.add(bAdd);
		bAdd.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){Add();}});
		bAdd.setAlignmentX(Component.RIGHT_ALIGNMENT);		
		/*Boton editar usuario*/
		JButton bEdit = new JButton(Locale.EDIT+" "+Locale.CHARGE);
		panel.add(bEdit);
		bEdit.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){Edit();}});
		bEdit.setAlignmentX(Component.RIGHT_ALIGNMENT);
		/*Boton borrar usuario*/
		JButton bDelete = new JButton(Locale.DELETE+" "+Locale.CHARGE);
		panel.add(bDelete);
		ButtonListener buttonListener = new ButtonListener();
		IController deleteController = new DeleteCargoController(table);
		deleteController.setView(this);
		buttonListener.associate(bDelete, deleteController);
		bDelete.setAlignmentX(Component.RIGHT_ALIGNMENT);
		/*Boton buscar usuario*/
		JButton bSerach = new JButton(Locale.SEARCH+" "+Locale.CHARGE);
		panel.add(bSerach);
		bSerach.addActionListener(new ActionListener () {public void actionPerformed(ActionEvent e){new SearchCargo(table);}});
		bSerach.setAlignmentX(Component.RIGHT_ALIGNMENT);
		
		/*devuelvo el panel creado*/
		return buttonsPane;
	}
	
	
	/**
	 * Funcion que devuelve el contenedor del panel principal
	 */
	public JPanel getContenedor() {
		return contenedor;
	}
	
	/**
	 * Funcion que retorna la tabla JTable
	 * Sirve para obtener columna seleccionada o 
	 * seleccionar una columna entre otros
	 * @return JTable "tabla principal"
	 */
	public JTable getTable() {
		return table;
	}
	
	/**
	 * Obtiene el modelo de tabla
	 * sirve entre otros para obtener los datos
	 * y la fila de nombres
	 * @return DefaultTableModel "modelo de tabla"
	 */
	public DefaultTableModel getTableModel(){
		return model;
	}
	
	/**
	 * establece el nombre de las columnas
	 * @param newNames "arreglo con los nombres nuevos"
	 */
	public void setColumnNames (String [] newNames) {
		columnNames = newNames;
	}
	
	
	/**
	 * retorna el nombre de las columnnas
	 * @return String[] "arreglo con el nombre de las columnas"
	 */
	public String[] getColumnNames () {
		return columnNames;
	}
	
	/**
	 * Permite cambiar los datos actuales de la tabla
	 * @param newData "matriz de object (datos)"
	 */
	public void setData (Object [][] newData) {
		data = newData;		
	}
	
	/**
	 * retorna la matriz de datos
	 * @return Object[][] "matriz de datos"
	 */
	public Object[][] getData(){
		return data;
	}
	
		
	/**
	 * Refresco la tabla que se muestra por pantalla
	 */
	public void Refresh() {		
		String [] cargo = {"Nro. Cargo","Codigo","Descripcion"};		
		Object[][] cargoTable = Cargo.getCargoTable();		
		setData(cargoTable);
		setColumnNames(cargo);
		model.setDataVector(data, columnNames);
	}
	
	
	/*
	 * Metodos internos Abrir Ventanas y Actualizar 
	 */
	
	/**
	 * Abre la ventana de agregar nuevo cargo
	 */
	private void Add() {
		AddCargo tmp = new AddCargo();
		tmp.addWindowListener(new WindowAdapter(){
			/*cuando la ventana se cerro actualizo lo mostrado por pantalla*/
			public void windowClosed(WindowEvent e){
				Refresh();
			}
		});
	}
	
	private void Edit() {
		/*obtengo la fila seleccionada*/
		final int fila = table.getSelectedRow();
		if (fila == -1) {
			JOptionPane.showMessageDialog(null,Locale.FIRST_SELECT_ROW,Locale.NOT_ROW_SELECTED,JOptionPane.WARNING_MESSAGE);
		}
		else {
			Cargo old;
			try {
				old = Cargo.getCargoByCodigo((model.getValueAt(fila, 1).toString()));
				EditCargo tmp = new EditCargo(old);
				tmp.setCode(old.getCodigo());
				tmp.setDescription(old.getDescripcion());
				tmp.addWindowListener(new WindowAdapter(){
					/*cuando la ventana se cerro actualizo lo mostrado por pantalla*/
					public void windowClosed(WindowEvent e){
						Refresh();
					}
				});
			} catch (cargoNotFound e) {
				JOptionPane.showMessageDialog(null,Locale.CHARGE+" "+Locale.NOT_FOUND,Locale.ERROR,JOptionPane.WARNING_MESSAGE);
				e.printStackTrace();
			}
		}
	}
	
	
	/**
	 * uso el present de iview para actualizar la tabla
	 */
	public void present(String model) {
		Refresh();		
	}

	public void close() {
		 //Nada por ahora		
		}
}